<!DOCTYPE HTML>
<html lang="zh-CN">




<head>
    <meta charset="utf-8">
    <meta name="keywords" content="操作系统第三章, 深度学习 故障诊断 Java">
    <meta name="description" content="河海大学 | 计算机与信息学院 | 信号与信息处理">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
    <meta name="renderer" content="webkit|ie-stand|ie-comp">
    <meta name="mobile-web-app-capable" content="yes">
    <meta name="format-detection" content="telephone=no">
    <meta name="apple-mobile-web-app-capable" content="yes">
    <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
    <!-- Global site tag (gtag.js) - Google Analytics -->


    <title>操作系统第三章 | 世庆的博客</title>
    <link rel="icon" type="image/png" href="/shiqing/favicon.png">

    <link rel="stylesheet" type="text/css" href="/shiqing/libs/awesome/css/all.css">
    <link rel="stylesheet" type="text/css" href="/shiqing/libs/materialize/materialize.min.css">
    <link rel="stylesheet" type="text/css" href="/shiqing/libs/aos/aos.css">
    <link rel="stylesheet" type="text/css" href="/shiqing/libs/animate/animate.min.css">
    <link rel="stylesheet" type="text/css" href="/shiqing/libs/lightGallery/css/lightgallery.min.css">
    <link rel="stylesheet" type="text/css" href="/shiqing/css/matery.css">
    <link rel="stylesheet" type="text/css" href="/shiqing/css/my.css">

    <script src="/shiqing/libs/jquery/jquery.min.js"></script>

    <script src="https://sdk.jinrishici.com/v2/browser/jinrishici.js" charset="utf-8"></script>
<meta name="generator" content="Hexo 6.3.0"></head>




    <body>
        <header class="navbar-fixed">
    <nav id="headNav" class="bg-color nav-transparent">
        <div id="navContainer" class="nav-wrapper container">
            <div class="brand-logo">
                <a href="/shiqing/" class="waves-effect waves-light">
                    
                    <img src="/shiqing/medias/logo.png" class="logo-img" alt="LOGO">
                    
                    <span class="logo-span">世庆的博客</span>
                </a>
            </div>
            

<a href="#" data-target="mobile-nav" class="sidenav-trigger button-collapse"><i class="fas fa-bars"></i></a>
<ul class="right nav-menu">
  
  <li class="hide-on-med-and-down nav-item">
    
    <a href="/shiqing/" class="waves-effect waves-light">
      
      <i class="fas fa-home" style="zoom: 0.6;"></i>
      
      <span>首页</span>
    </a>
    
  </li>
  
  <li class="hide-on-med-and-down nav-item">
    
    <a href="/shiqing/tags" class="waves-effect waves-light">
      
      <i class="fas fa-tags" style="zoom: 0.6;"></i>
      
      <span>标签</span>
    </a>
    
  </li>
  
  <li class="hide-on-med-and-down nav-item">
    
    <a href="/shiqing/categories" class="waves-effect waves-light">
      
      <i class="fas fa-bookmark" style="zoom: 0.6;"></i>
      
      <span>分类</span>
    </a>
    
  </li>
  
  <li class="hide-on-med-and-down nav-item">
    
    <a href="/shiqing/archives" class="waves-effect waves-light">
      
      <i class="fas fa-archive" style="zoom: 0.6;"></i>
      
      <span>归档</span>
    </a>
    
  </li>
  
  <li class="hide-on-med-and-down nav-item">
    
    <a href="/shiqing/about" class="waves-effect waves-light">
      
      <i class="fas fa-user-circle" style="zoom: 0.6;"></i>
      
      <span>关于</span>
    </a>
    
  </li>
  
  <li class="hide-on-med-and-down nav-item">
    
    <a href="/shiqing/contact" class="waves-effect waves-light">
      
      <i class="fas fa-comments" style="zoom: 0.6;"></i>
      
      <span>留言板</span>
    </a>
    
  </li>
  
  <li class="hide-on-med-and-down nav-item">
    
    <a href="/shiqing/friends" class="waves-effect waves-light">
      
      <i class="fas fa-address-book" style="zoom: 0.6;"></i>
      
      <span>友情链接</span>
    </a>
    
  </li>
  
  <li>
    <a href="#searchModal" class="modal-trigger waves-effect waves-light">
      <i id="searchIcon" class="fas fa-search" title="搜索" style="zoom: 0.85;"></i>
    </a>
  </li>
</ul>


<div id="mobile-nav" class="side-nav sidenav">

    <div class="mobile-head bg-color">
        
        <img src="/shiqing/medias/logo.png" class="logo-img circle responsive-img">
        
        <div class="logo-name">世庆的博客</div>
        <div class="logo-desc">
            
            河海大学 | 计算机与信息学院 | 信号与信息处理
            
        </div>
    </div>

    

    <ul class="menu-list mobile-menu-list">
        
        <li class="m-nav-item">
	  
		<a href="/shiqing/" class="waves-effect waves-light">
			
			    <i class="fa-fw fas fa-home"></i>
			
			首页
		</a>
          
        </li>
        
        <li class="m-nav-item">
	  
		<a href="/shiqing/tags" class="waves-effect waves-light">
			
			    <i class="fa-fw fas fa-tags"></i>
			
			标签
		</a>
          
        </li>
        
        <li class="m-nav-item">
	  
		<a href="/shiqing/categories" class="waves-effect waves-light">
			
			    <i class="fa-fw fas fa-bookmark"></i>
			
			分类
		</a>
          
        </li>
        
        <li class="m-nav-item">
	  
		<a href="/shiqing/archives" class="waves-effect waves-light">
			
			    <i class="fa-fw fas fa-archive"></i>
			
			归档
		</a>
          
        </li>
        
        <li class="m-nav-item">
	  
		<a href="/shiqing/about" class="waves-effect waves-light">
			
			    <i class="fa-fw fas fa-user-circle"></i>
			
			关于
		</a>
          
        </li>
        
        <li class="m-nav-item">
	  
		<a href="/shiqing/contact" class="waves-effect waves-light">
			
			    <i class="fa-fw fas fa-comments"></i>
			
			留言板
		</a>
          
        </li>
        
        <li class="m-nav-item">
	  
		<a href="/shiqing/friends" class="waves-effect waves-light">
			
			    <i class="fa-fw fas fa-address-book"></i>
			
			友情链接
		</a>
          
        </li>
        
        
        <li><div class="divider"></div></li>
        <li>
            <a href="https://github.com/sqtian-hhu/" class="waves-effect waves-light" target="_blank">
                <i class="fab fa-github-square fa-fw"></i>Fork Me
            </a>
        </li>
        
    </ul>
</div>


        </div>

        
            <style>
    .nav-transparent .github-corner {
        display: none !important;
    }

    .github-corner {
        position: absolute;
        z-index: 10;
        top: 0;
        right: 0;
        border: 0;
        transform: scale(1.1);
    }

    .github-corner svg {
        color: #0f9d58;
        fill: #fff;
        height: 64px;
        width: 64px;
    }

    .github-corner:hover .octo-arm {
        animation: a 0.56s ease-in-out;
    }

    .github-corner .octo-arm {
        animation: none;
    }

    @keyframes a {
        0%,
        to {
            transform: rotate(0);
        }
        20%,
        60% {
            transform: rotate(-25deg);
        }
        40%,
        80% {
            transform: rotate(10deg);
        }
    }
</style>

<a href="https://github.com/sqtian-hhu/" class="github-corner tooltipped hide-on-med-and-down" target="_blank"
   data-tooltip="Fork Me" data-position="left" data-delay="50">
    <svg viewBox="0 0 250 250" aria-hidden="true">
        <path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z"></path>
        <path d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2"
              fill="currentColor" style="transform-origin: 130px 106px;" class="octo-arm"></path>
        <path d="M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z"
              fill="currentColor" class="octo-body"></path>
    </svg>
</a>
        
    </nav>

</header>

        



<div class="bg-cover pd-header post-cover" style="background-image: url('/shiqing/medias/featureimages/0.jpg')">
    <div class="container" style="right: 0px;left: 0px;">
        <div class="row">
            <div class="col s12 m12 l12">
                <div class="brand">
                    <h1 class="description center-align post-title">操作系统第三章</h1>
                </div>
            </div>
        </div>
    </div>
</div>




<main class="post-container content">

    
    <link rel="stylesheet" href="/shiqing/libs/tocbot/tocbot.css">
<style>
    #articleContent h1::before,
    #articleContent h2::before,
    #articleContent h3::before,
    #articleContent h4::before,
    #articleContent h5::before,
    #articleContent h6::before {
        display: block;
        content: " ";
        height: 100px;
        margin-top: -100px;
        visibility: hidden;
    }

    #articleContent :focus {
        outline: none;
    }

    .toc-fixed {
        position: fixed;
        top: 64px;
    }

    .toc-widget {
        width: 345px;
        padding-left: 20px;
    }

    .toc-widget .toc-title {
        padding: 35px 0 15px 17px;
        font-size: 1.5rem;
        font-weight: bold;
        line-height: 1.5rem;
    }

    .toc-widget ol {
        padding: 0;
        list-style: none;
    }

    #toc-content {
        padding-bottom: 30px;
        overflow: auto;
    }

    #toc-content ol {
        padding-left: 10px;
    }

    #toc-content ol li {
        padding-left: 10px;
    }

    #toc-content .toc-link:hover {
        color: #42b983;
        font-weight: 700;
        text-decoration: underline;
    }

    #toc-content .toc-link::before {
        background-color: transparent;
        max-height: 25px;

        position: absolute;
        right: 23.5vw;
        display: block;
    }

    #toc-content .is-active-link {
        color: #42b983;
    }

    #floating-toc-btn {
        position: fixed;
        right: 15px;
        bottom: 76px;
        padding-top: 15px;
        margin-bottom: 0;
        z-index: 998;
    }

    #floating-toc-btn .btn-floating {
        width: 48px;
        height: 48px;
    }

    #floating-toc-btn .btn-floating i {
        line-height: 48px;
        font-size: 1.4rem;
    }
</style>
<div class="row">
    <div id="main-content" class="col s12 m12 l9">
        <!-- 文章内容详情 -->
<div id="artDetail">
    <div class="card">
        <div class="card-content article-info">
            <div class="row tag-cate">
                <div class="col s7">
                    
                    <div class="article-tag">
                        
                            <a href="/shiqing/tags/%E5%86%85%E5%AD%98/">
                                <span class="chip bg-color">内存</span>
                            </a>
                        
                    </div>
                    
                </div>
                <div class="col s5 right-align">
                    
                    <div class="post-cate">
                        <i class="fas fa-bookmark fa-fw icon-category"></i>
                        
                            <a href="/shiqing/categories/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/" class="post-category">
                                操作系统
                            </a>
                        
                    </div>
                    
                </div>
            </div>

            <div class="post-info">
                
                <div class="post-date info-break-policy">
                    <i class="far fa-calendar-minus fa-fw"></i>发布日期:&nbsp;&nbsp;
                    2021-05-24
                </div>
                

                

                

                

                
            </div>
        </div>
        <hr class="clearfix">

        
        <!-- 是否加载使用自带的 prismjs. -->
        <link rel="stylesheet" href="/shiqing/libs/prism/prism.css">
        

        

        <div class="card-content article-card-content">
            <div id="articleContent">
                <h2 id="第三章"><a href="#第三章" class="headerlink" title="第三章"></a>第三章</h2><h2 id="内存"><a href="#内存" class="headerlink" title="内存"></a>内存</h2><p>内存是用于存放数据的硬件。程序执行前需要先放到内存中才能被cpu处理</p>
<p>逻辑地址与物理地址<br>四个学号分别为0，1，2，3，安排到酒店5，6，7，8号房间<br>0, 1, 2, 3：相对位置 -&gt; 逻辑地址<br>5, 6, 7, 8: 绝对位置 -&gt; 物理地址</p>
<p>从写程序到程序运行</p>
<p>程序员 -编辑-&gt; 源代码文件1 ——&gt;目标模块1 (逻辑地址)<br>               源代码文件2 -编译-&gt;目标模块2    —-链接—-&gt;装入模块 形成完整逻辑地址 —&gt;内存 物理地址<br>               源代码文件3 ——&gt;目标模块3</p>
<p>编译: 由编译程序将用户源代码编译成若干个目标模块(编译就是把高级语言翻译成机器语言)<br>链接: 由链接程序将编译后形成的一组目标模块,以及所需库函数链接在一起,形成一个完整的装入模块<br>装入(装载): 由装入程序将装入模块装入内存运行	   </p>
<h3 id="装入的三种方式"><a href="#装入的三种方式" class="headerlink" title="装入的三种方式"></a>装入的三种方式</h3><pre><code>完成逻辑地址--&gt;物理地址转换
</code></pre>
<ol>
<li>绝对装入</li>
<li>静态重定位</li>
<li>动态重定位</li>
</ol>
<p>绝对装入<br>    在编译时,如果知道程序将放到内存中的哪个位置, 编译程序将产生绝对地址的目标地址<br>    绝对装入只适用于单道程序环境</p>
<p>静态重定位<br>    装入时转换<br>    由装入程序对地址”重定位”, 根据内存情况,将装入模块装入到内存的适当位置<br>    特点: 装入一个作业时,必须分配其要求的全部内存空间.<br>          如果没有足够的内存,就不能装入<br>          作业一旦进入内存,运行期间就不能再移动<br>    早期多道批处理系统</p>
<p>动态重定位<br>    运行时转换<br>    装入后并不会立即改为物理地址, 而是把地址转换推迟到程序真正要执行时才进行.<br>    因此装入内存的所有地址依然是逻辑地址.<br>    需要一个重定位寄存器的支持,存放装入模块存放的起始位置<br>    允许程序在内存中发生移动(改变寄存器的值), 还可以分配不连续的地区<br>    现代操作系统</p>
<h2 id="内存管理"><a href="#内存管理" class="headerlink" title="内存管理"></a>内存管理</h2><ol>
<li>OS负责内存空间的分配与回收{连续,非连续}</li>
<li>OS需要提供某种技术从逻辑上对内存空间进行扩充</li>
<li>OS需要提供地址转换功能, 负责程序的逻辑地址与物理地址的转换</li>
<li>OS需要提供内存保护功能,保证各进程在各自存储空间内运行,互不干扰</li>
</ol>
<p>两种保护方式</p>
<ol>
<li>设置上下限寄存器, 上下限物理地址</li>
<li>利用重定位寄存器(基址寄存器: 起始物理地址),界地址寄存器(限长寄存器: 最大逻辑地址)</li>
</ol>
<p>内存空间的扩充<br>    覆盖技术<br>    交换技术<br>    虚拟存储技术</p>
<h3 id="覆盖与交换"><a href="#覆盖与交换" class="headerlink" title="覆盖与交换"></a>覆盖与交换</h3><ol>
<li><p>覆盖技术<br> 用来解决”程序大小超过物理内存总和”的问题<br> 将程序分为多个段(多个模块).<br> 常用的段常驻内存, 不常用的段在需要时调入内存</p>
<p> 内存中分为一个”固定区”和若干个”覆盖区”</p>
<p> 必须由程序员声明覆盖结构,操作系统完成自动覆盖.<br> 缺点: 对用户不透明,增加了用户编程负担<br> 现已经很少使用了</p>
</li>
<li><p>交换技术<br> 内存空间紧张时,系统将内存中某些进程暂时换出内存(挂起),<br> 把外存中某些已具备运行条件的进程换入内存(进程在内存与磁盘间动态调度)</p>
<p> PCB常驻内存</p>
<p> 中级调度(内存调度), 就是要决定将哪个处于挂起状态的进程重新调入内存</p>
<p> 磁盘存储分成文件区和对换区<br> 文件区主要用于存放文件, 主要追求存储空间的利用率, 采用离散分配方式<br> 对换区只占磁盘的小部分, 被换出的进程存于此, 采用连续分配方式, 追求换入换出的速度<br> 对换区的I&#x2F;O速度比文件区更快</p>
<p> 覆盖是在同一个程序或进程中进行<br> 交换是在不同进程或作业之间进行的</p>
</li>
</ol>
<h3 id="连续分配管理方式"><a href="#连续分配管理方式" class="headerlink" title="连续分配管理方式"></a>连续分配管理方式</h3><pre><code>为用户进程分配的必须是一个连续的内存空间

单一连续分配
固定分区分配
动态分区分配
</code></pre>
<p>单一连续分配<br>    内存被分为系统区和用户区<br>    系统区通常位于内存的低地址部分,用于存放操作系统相关数据;<br>    用户区只能有一道用户程序, 用户程序独占整个用户空间</p>
<pre><code>优点: 实现简单; 无外部碎片; 可以采用覆盖技术扩充内存;
      不一定需要采取内存保护
缺点: 只能用于单用户,单任务的OS中, 有内部碎片(分配给某进程的内存区域中,如果有些部分没有用上, 就是内部碎片);
      存储器利用率低
</code></pre>
<p>固定分区分配<br>    为了能在内存中装入多道程序,且这些程序不会相互干扰, 将用户空间划分为若干个固定大小的分区,<br>    在每个分区中只装入一道作业</p>
<pre><code>系统区  分区1  分区2  分区3 ...

分区大小相等: 缺乏灵活性, 但适用于一台计算机控制多个相同对象的场合
分区大小不相等: 增加灵活性, 可以满足不同大小的进程需求

OS需要建立一个分区说明表来实现各个分区的分配与回收

优点: 实现简单, 无外部碎片
缺点: 如果程序太大,所有分区都无法满足则只能使用覆盖技术解决, 会产生内部碎片
</code></pre>
<p>动态分区分配<br>    可变分区分配, 这种分配方式不会预先划分内存分区, 而是在进程装入内存时,<br>    根据进程的大小动态地建立分区, 并使分区的大小正好适合进程的需要.<br>    因此分区的大小和数目是可变的</p>
<pre><code>系统要用什么样的数据结构记录内存的使用情况呢?
两种常用的数据结构: 空闲分区表
                    空闲分区链

动态分区分配没有内部碎片，但是有外部碎片
内部碎片：分配给某进程的内存区域中，如果有些部分没有用上
外部碎片：是指内存中的某些分区由于太小而难以利用

如果内存中空闲空间的总和本来可以满足某进程的要求，但由于进程需要的是一整块连续的内存空间
因此这些“碎片”不能满足进程的需求

可以通过紧凑技术来解决外部碎片，动态重定位装入，修改重定位寄存器

动态分区分配算法
    当多个空闲分区满足需求时，应该选哪个分区进行分配？
    1. 首次适应算法
    2. 最佳适应算法
    3. 最坏适应算法
    4. 邻近适应算法

首次适应算法
    思想：每次都从低地址开始查找，找到第一个能满足大小的空闲分区
    实现：空闲分区以地址递增的次序排列。每次分配内存时顺序查找空闲分区链(或空闲分区表)
          找到大小能满足要求的第一个空闲分区

最佳适应算法
    思想: 由于动态分区分配是一种连续分配方式,为各进程分配的空间必须是连续的一整片区域.
          因此为了保证当&quot;大进程&quot;到来时能有连续的大片空间, 可以尽可能多的留下大片的空闲区
          即优先使用更小的空闲区
    实现: 空闲分区按容量递增次序链接. 每次分配内存时顺序查找空闲分区链(或空闲分区表)
          找到大小能满足要求的第一个空闲分区
    缺点: 每次都选最小的分区进行分配, 会留下越来越多的,很小的,难以利用的内存块.
          因此这种方法会产生很多外部碎片

最坏适应算法
    又称最大适应算法
    思想: 为了解决最佳适应算法的问题(即留下太多难以利用的小碎片),可以在每次分配时优先使用最大的连续空闲区
          这样分配后的空闲区就不会太小,更方便使用. 
    实现: 空闲分区按容量递减次序链接. 每次分配内存时顺序查找空闲分区链(或空闲分区表)
          找到大小能满足要求的第一个空闲分区
    缺点: 每次都选最大的分区进行分配, 虽然可以让分配后留下的空闲区更大更可用,但是这种方式会导致较大的连续空闲去被迅速用完
          如果之后有大进程到达,就没有内存分区可用了

邻近适应算法
    思想: 首次适应算法每次都从链头开始查找. 这可能会导致低地址部分出现很多小的空闲分区
          而每次分配查找时, 都要经过这些分区, 因此也增加了查找的开销.
          如果每次都从上次查找结束的位置开始检索,就能解决上述问题
    实现: 空闲分区以地址递增的次序排列。每次分配内存时从上次查找结束的位置查找空闲分区链(或空闲分区表)
          找到大小能满足要求的第一个空闲分区
    
首次适应算法每次都要从头开始查找,每次都检索低地址的小分区. 但是这种规则也决定了当低地址部分有更小的分区可以满足需求时
会更有可能用到低地址部分的小分区, 也会更有可能把高地址部分的大分区保留下来(最佳适应算法的优点)
邻近适应算法的规则可能会导致无论低地址,高地址部分的空闲分区都有相同的概率被使用,
也就导致了高地址部分的大分区更可能被使用,从而划分为小分区,最后导致无大分区可用(最大适应算法的缺点)

四种算法综合来看，反而是首次适应算法更好
</code></pre>
<h3 id="非连续分配"><a href="#非连续分配" class="headerlink" title="非连续分配"></a>非连续分配</h3><p>连续分配方式的缺点<br>支持多道程序的两种连续分配方式</p>
<ol>
<li>固定分区分配: 缺乏灵活性, 会产生大量的内部碎片, 内存的利用率很低</li>
<li>动态分区分配: 会产生很多外部碎片,虽然可以用”紧凑”技术来处理, 但是”紧凑”的时间代价很高</li>
</ol>
<p>如果允许将一个进程分散地装入到许多不相邻的分区中, 便可充分地利用内存,而无需再进行”紧凑”<br>基于这一思想, 产生了”非连续分配方式”, 或者称为”离散分配方式”</p>
<p>连续分配: 为用户进程分配的必须是一个连续的内存空间<br>非连续分配: 为用户进程分配的可以是一些分散的内存空间</p>
<p>基本分页存储的管理的思想：把内存分为一个个相等的小分区,每个分区就是一个”页框”,页框号从0开始.<br>    再按照分区大小把进程拆分成一个个小部分, 称为页,从0开始. 各个页面不必连续存放</p>
<p>如何实现了逻辑地址到物理地址的转换<br>    1. 算出逻辑地址对应的页号<br>    2. 要知道该页号对应页面在内存中的起始地址<br>    3. 算出逻辑地址在页面内的偏移量<br>    4. 物理地址&#x3D;页面地址+页面偏移量</p>
<pre><code>页号 = 逻辑地址/页面长度
业内偏移量=逻辑地址%页面长度

如果每个页面大小为2^k B,用二进制表示逻辑地址, 则末尾k位即为页内偏移量
其余部分就是页号

为了知道进程的每个页面在内存中存放的位置,操作系统要为每个进程建立一张页表
页表记录每个页面存进哪个页框

页号  块号(页框号)

=&gt; 物理地址=页框起始地址+页内偏移量
</code></pre>
<p>基本地址变换机构<br>    基址地址变换机构可以借助进程的页表将逻辑地址转换为物理地址<br>    通常会在系统中设置一个页表寄存器(PTR), 存放页表在内存中的起始地址F和页表长度M.<br>    进程未执行时,页表的始址和页表长度放在进程控制块(PCB)中,当进程被调度时,<br>    操作系统内核会把他们放到页表寄存器中</p>
<pre><code>地址变换过程
    1. 根据逻辑地址算出页号、页内偏移量
    2. 页号的合法性检查(与页表长度对比)
    3. 若页号合法, 再根据页表起始地址, 页号找到对应页表项
    4. 根据页表项中记录的内存块号,页内偏移量 得到最终物理地址
    5. 访问物理内存对应的内存单元
</code></pre>
<p>具有快表的地址变换机构</p>
<pre><code>时间局部性: 如果执行了程序中的某条指令, 那么不久后这条指令很有可能再次执行;
            如果某个数据被访问过,不久之后该数据很有可能再次被访问
空间局部性: 一旦程序访问了某个存储单元, 在不久之后, 其附近的存储单元也很有可能被访问
            因为很多数据在内存中都是连续存放的

基本地址变换机构中, 每次都要访问一个逻辑地址,都需要查询内存中的页表.
由于局部性原理,可能连续很多次查到的都是同一个页表项. 
利用此特性减少访问页表的次数

快表, 又称联想寄存器(TLB), 是一种访问速度比内存快很多的高速缓冲存储器,
用来存放当前访问的若干页表项, 以加速地址变换的过程. 
与此对应, 内存中的页表常称为慢表

引入快表后地址的变换过程
1. cpu给出逻辑地址, 由某个硬件算得页号,页内偏移量, 将页号与快表中的所有页号比较
2. 如果找到匹配的页号, 则直接从快表中取出该页对应的内存块号,再将内存块号与页内偏移量拼接形成物理地址
   仅需一次访存
3. 如果没有匹配的页号,则需要访问内存中的页表, 找到对应页表项,得到页面存放的内存块号
   同时复制到快表中.
   需要两次访存
   
</code></pre>
<h3 id="两级页表"><a href="#两级页表" class="headerlink" title="两级页表"></a>两级页表</h3><p>单级页表存在的问题<br>问题1: 页表必须连续存放,因此当页表很大时,需要占用很多个连续的页框<br>问题2: 没有必要让整个页表常驻内存,因为进程在一段时间内可能只需要访问几个特定的页面</p>
<p>如何解决进程在内存中必须连续存储的问题的?<br>将进程地址空间分页, 并为其建立一张页表, 记录各页面的存放位置</p>
<p>同理, 可以把连续存放的页表再分页以解决问题1</p>
<p>一级页号|二级页号|页内偏移量</p>
<p>页目录表(顶级页表) —&gt;0#页表(二级页表) —&gt;内存块<br>                   —&gt;1#页表			—&gt;内存块<br>                   —&gt;2#页表			—&gt;内存块</p>
<p>如何实现地址变换</p>
<ol>
<li>按照地址结构将逻辑地址分成三部分</li>
<li>从PCB中读出页目录表始址, 再根据一级页号查页目录表, 找到下一级页表再内存中的存放位置</li>
<li>根据二级页号查表, 找到最终想访问的内存块号</li>
<li>结合页内偏移量得到物理地址</li>
</ol>
<p>对于问题2<br>可以在需要访问页面时才把页面调入内存(虚拟存储技术). 可以在页表项中增加一个标志位,由于表示该页面是否已经调入内存<br>若想访问的页面不在内存中,则产生缺页中断(内中断),然后将目标页面从外存调入内存</p>
<p>N级页表访问一个逻辑地址需要N+1次访存</p>
<h3 id="基本分段存储管理"><a href="#基本分段存储管理" class="headerlink" title="基本分段存储管理"></a>基本分段存储管理</h3><p>与分页最大的区别就是离散分配时所分配地址空间的基本单位不同</p>
<p>分段 类似于分页<br>段表 类似于页表</p>
<p>进程的地址空间: 按照程序自身的逻辑关系划分为若干个段, 每个段都有一个段名(在低级语言中,程序员使用段名来编程)<br>                每段从0开始编址</p>
<p>内存分配规则: 以段为单位进行分配, 每个段在内存中占据连续空间, 但各段之间可以不相邻</p>
<p>分段系统的逻辑地址结构由段号(段名)和段内地址(段内偏移量)所组成</p>
<p>段号|段内地址</p>
<p>段号的位数决定了每个进程最多可以分几个段<br>段内地址位数决定了每个段的最大长度是多少</p>
<p>程序分多个段, 各段离散地装入内存,为了保证程序能正常运行,就必须能从物理内存中找到各个逻辑段的存放位置<br>为此,需为每个进程建立一张段映射表, 简称段表</p>
<ol>
<li>每个段对应一个段表项, 其中记录理该段在内存中的起始位置(又称基址)和段的长度<br>段号 | 段长 | 基址 </li>
<li>各个段表项的长度是相同的,因此段号可以是隐含的, 不占存储空间</li>
</ol>
<p>对比:<br>    页是信息的物理单位. 分页目的是为了实现离散分配, 提高内存利用率.<br>    仅仅系统管理需要,对用户是不可见的<br>    段是信息的逻辑单位. 主要目的是满足用户需求, 对用户是可见的<br>    分页的用户进程地址空间是一维的,程序员仅需给出一个记忆符即可表示一个地址<br>    分段的用户进程地址空间是二维的,程序员在标识一个地址时, 既要给出段名,也要给出段内地址</p>
<p>分段更容易实现信息的共享与保护<br>不能被修改的代码称为纯代码或可重入代码(不属于临界资源). 这样的代码是可共享的</p>
<h3 id="段页式管理方式"><a href="#段页式管理方式" class="headerlink" title="段页式管理方式"></a>段页式管理方式</h3><p>分段,分页的优缺点<br>分页: 优: 内存利用率高,不产生外部碎片,会有少量内部碎片<br>      缺: 不方便按照逻辑模块实现共享与保护<br>分段: 优: 更容易实现信息的共享与保护<br>      缺: 如果段长很大,为其分配很大的连续空间会很不方便.会产生外部碎片</p>
<p>经典折中<br>&#x3D;&gt;<br>先分段再分页<br>         0号段—&gt;0号页<br>              —&gt;1号页</p>
<p>进程—&gt; 1号段—&gt;0号页<br>              —&gt;1号页</p>
<pre><code>     2号段---&gt;0号页
     
</code></pre>
<p>段页式<br>段号 | 页号 | 页内偏移<br>段号位数决定了每个进程最多可以分多少段<br>页号位数决定了每个段最大有多少页<br>页内偏移量决定了页面大小,内存块大小是多少</p>
<ol>
<li>由逻辑地址得到段号,页号,页内偏移量</li>
<li>段号与段表寄存器中的段长度比较,检查是否越界</li>
<li>由段表始址,段号找到对应段表项</li>
<li>根据段表中记录的页表长度,检查页号是否越界</li>
<li>由段表中的页表地址,页号得到查询页表,找到相应页表项</li>
<li>由页面存放的内存块号,页内偏移量得到最终的物理地址</li>
<li>访问目标单元</li>
</ol>
<p>引入快表, 若快表命中则仅需一次访存(用段号和页号作为查询关键字)</p>
<h2 id="虚拟内存"><a href="#虚拟内存" class="headerlink" title="虚拟内存"></a>虚拟内存</h2><p>传统存储管理{<br>    连续分配{<br>        单一连续分配<br>        固定分区分配<br>        动态分区分配<br>    }<br>    非连续分配{<br>        基本分页存储管理<br>        基本分段存储管理<br>        基本段页式存储管理<br>    }<br>}</p>
<p>传统存储管理中, 很多暂时用不到的数据也会长期占用内存, 导致内存利用率不高<br>一次性: 作业必须一次性全部装入内存后才能开始运行, 会造成两个问题:<br>        1. 作业很大时,不能全部装入内存,导致大作业无法运行<br>        2. 当大量作业要求运行时, 由于内存无法容纳所有作业,因此只有少量作业能运行,导致多道程序并发度下降</p>
<p>驻留性: 一旦作业被装入内存,就会一直驻留在内存中,直至作业运行结束. 事实上,在一个时间段内,<br>        只需要访问作业的一小部分数据即可正常运行, 这就导致了内存中会驻留大量的,暂时用不到的数据<br>        浪费了宝贵的内存资源</p>
<p>高速缓冲技术的思想: 将近期会频繁访问到的数据放到更高速的存储器中,暂时用不到的数据放在更低速的存储器中</p>
<p>寄存器–&gt;高速缓存–&gt;内存–&gt;外存(如磁盘,磁带)</p>
<p>容量小,速度快,成本高&lt;—-&gt;容量大,速度慢,成本低</p>
<p>基于局部性原理,在程序装入时,可以将程序中很快会用到的部分装入内存, 暂时用不到的部分留在外存<br>就可以让程序开始执行<br>在程序执行过程中,当所访问的信息不在内存时,由操作系统负责将所需信息从外存调入内存,<br>然后继续执行程序<br>若内存空间不够,由操作系统负责将内存中暂时用不到的信息换出到外存.<br>在操作系统的管理下,在用户看来似乎有一个比实际内存大得多的内存,这就是虚拟内存</p>
<p>虚拟内存有以下三个主要特征:<br>多次性: 无需在作业运行时一次性全部装入内存,而是允许被分成多次调入内存<br>对换性: 在作业运行时无需一直常驻内存,而是允许在作业运行过程中,将作业换入换出<br>虚拟性: 从逻辑上扩充了内存的容量,使用户看到的内存容量,远大于实际的容量</p>
<p>虚拟内存技术的实现需要建立在离散分配的内存管理方式基础上</p>
<ol>
<li>请求分页存储管理</li>
<li>请求分段存储管理</li>
<li>请求段页式存储管理</li>
</ol>
<p>主要区别: 在程序执行过程中,当所访问的信息不再内存时,由操作系统负责将所需信息从外存调入内存,然后继续执行程序<br>          若内存空间不够,由操作系统负责将内存中暂时用不到的信息换出到外存</p>
<p>操作系统要提供请求调页(或请求调段)功能<br>操作系统要提供页面置换（或段置换）功能</p>
<p>请求分页存储管理<br>    页表机制<br>    缺页中断机构<br>    地址变换机构</p>
<p>请求页表新增了四个字段<br>    页号 | 内存块号 | 状态位 | 访问字段 | 修改位 | 外存地址<br>状态位: 是否已经调入内存<br>访问字段: 记录最近被访问过几次,或记录上次访问的时间,供置换算法选择换出页面时参考<br>修改位: 页面调入内存后是否被修改过<br>外存地址: 页面在外存中的存放位置</p>
<p>在请求分页系统中,每当要访问的页面不在内存时, 便产生一个缺页中断,<br>然后由操作系统的缺页中断处理程序处理中断<br>此时缺页的进程阻塞, 放入阻塞队列,调页完成后再将其唤醒, 放回就绪队列</p>
<p>如果内存中有空闲块, 则为进程分配一个空闲块, 将所缺页面装入该块, 并修改页表中相应的页表项<br>如果内存中没有空闲块, 则由页面置换算法选择一个页面淘汰,<br>若该页面在内存期间被修改过, 则要将其写回外存, 未修改过的页面不用写回外存</p>
<h3 id="页面置换算法"><a href="#页面置换算法" class="headerlink" title="页面置换算法"></a>页面置换算法</h3><p>页面的换入,换出需要磁盘I&#x2F;O, 会有比较大的开销<br>因此好的页面置换算法应该追求更少的缺页率</p>
<ol>
<li><p>最佳置换算法(OPT)<br> 每次选择淘汰的页面将是以后永不使用,或者在最长时间内不再被访问的页面, 这样可以保证最低的缺页率</p>
<p> 理想化算法, 实际上无法实现</p>
</li>
<li><p>先入先出算法(FIFO)<br> 每次淘汰最早进入内存的页面<br> 实现方法: 把调入内存的页面根据调入的先后顺序排成一个队列, 需要换出页面时选择队头页面即可<br>       队列的最大长度取决于系统为进程分配了多少内存块<br> Belady异常–当为进程分配的物理块数增大时,缺页次数不减反增的异常现象<br> 只有FIFO算法会产生Belady异常,另外,FIFO算法虽然实现简单,但是该算法与进程实际运行时的规律不适应<br> 因为先进入的页面也有可能最经常被访问. 因此算法性能差</p>
</li>
<li><p>最近最久未使用算法(LRU, least recently used)<br> 每次淘汰的页面是最近最久未使用的页面<br> 实现方法: 赋予每个页面对应的页表项中, 用访问字段记录该页面自上次被访问以来所经历的时间t<br>       当需要淘汰一个页面时,选择现有页面中t最大的<br> 该算法的实现需要专门的硬件支持,虽然算法性能好,但是实现困难,开销大</p>
</li>
<li><p>时钟置换算法(CLOCK)<br> 一种性能和开销较均衡的算法<br> 又称为最近未用算法(NRU, not recently used)<br> 简单的CLOCK算法实现方法: 每个页面设置一个访问位, 再将内存中的页面都通过链接指针链接成一个队列<br> 当某页被访问时, 其访问位置为1. 当需要淘汰一个页面时, 只需要检查页的访问位.<br> 如果是0,就选择该页换出; 如果是1, 则将他置为0,暂不换出,继续检查下一个页面,<br> 若第一轮扫描中所有页面都是1, 则将这些页面的访问位依次置为0后,再进行第二轮扫描<br> (第二轮扫描中一定会有访问位为0的页面, 因此简单的CLOCK算法选择一个淘汰页面最多会经过两轮扫描)<br><br> 改进的时钟置换算法:<br> 简单时钟仅考虑一个页面最近是否被访问过. 事实上, 如果被淘汰的页面没有被修改过,<br> 就不需要执行I&#x2F;O操作写回外存.只有被淘汰的的页面被修改过时才需要写回外存<br> 在其他条件都相同时, 优先淘汰没有修改过的页面, 避免I&#x2F;O操作<br> 修改位&#x3D;0表示没被修改过<br> 用(访问位,修改位)表示各页面状态<br><br> 算法规则: 将所有可能被置换的页面排成一个循环队列<br> 第一轮: 从当前位置开始扫描到第一个(0,0)的帧用于替换.<br>         本轮扫描不修改任何标志位<br> 第二轮: 若第一轮扫描失败,则重新扫描,查找第一个(0,1)的帧用于替换,<br>         本轮将所有扫描过的帧访问位设为0<br> 第三轮: 若第二轮扫描失败,则重新扫描,查找第一个(0,0)的帧用于替换,<br>         本轮扫描不修改任何标志位<br> 第四轮: 若第三轮扫描失败,则重新扫描,查找第一个(0,1)的帧用于替换<br><br> 第一轮–&gt;第一优先级: 最近没访问,且没有修改过的页面<br> 第二轮–&gt;第二优先级: 最近没访问,但修改过的页面<br> 第三轮–&gt;第三优先级: 最近访问过,但没修改过的页面<br> 第四轮–&gt;第四优先级: 最近访问过且修改过的页面</p>
<p> 算法开销较小, 性能也不错</p>
</li>
</ol>
<h3 id="页面分配策略"><a href="#页面分配策略" class="headerlink" title="页面分配策略"></a>页面分配策略</h3><p>驻留集: 指请求分页存储管理中给进程分配的物理块的集合</p>
<p>在采用了虚拟存储技术的系统中,驻留集大小一般小于进程的总大小<br>若驻留集太小, 会导致缺页频繁, 若太大, 会导致多道程序并发度下降</p>
<p>固定分配:<br>    OS为每个进程分配一组固定数组的物理块, 在进程运行期间不再改变, 即驻留集大小不变</p>
<p>可变分配:<br>    先为每个进程分配一定的物理块,运行期间可改变</p>
<p>局部置换:<br>    发生缺页时只能选进程自己的物理块置换<br>全局置换:<br>    可以将OS保留的空闲物理块分配给缺页进程, 也可以将别的进程持有的物理块置换到外存<br>    再分配给缺页进程</p>
<pre><code>        局部置换	全局置换
</code></pre>
<p>固定分配	   有		   无<br>可变分配	   有          有</p>
<p>可变分配全局置换: 只要缺页就给分配新的物理块<br>可变分配局部置换: 要根据发生缺页的频率来动态地增加或减少进程的物理块</p>
<p>何时调入页面</p>
<ol>
<li><p>预调页策略: 根据局部性原理, 依次调入若干个相邻的页面可能比一次调一个更高效,<br>        但如果调入的页面大多数没有被访问,则又是低效的<br>        主要用于进程的首次调入</p>
</li>
<li><p>请求调页策略:<br> 进程在运行期间发现缺页时才将所缺页面调入内存. 由这种策略调入的页面一定会被访问到<br> 但由于每次只调入一页,每次调页都要磁盘I&#x2F;O操作,因此I&#x2F;O开销较大</p>
</li>
</ol>
<p>从何处调页<br>    对换区: 采用连续存储,速度比文件区更快</p>
<pre><code>对换区足够大: 运行前将数据复制从文件区到对换区, 之后所有的出入都在内存与对换区之间进行
对换区不够大: 不会修改的数据每次都从文件区调入;
              会修改的数据调出到对换区, 需要时再从对换区调入
              
UNIX方式: 第一次使用的都从文件区调入, 调出的写回对换区,再使用时从对换区调入
</code></pre>
<p>抖动现象<br>    刚刚换出的页面马上又要调入内存, 刚刚换入的页面马上又要换出, 这种频繁的页面调度行为称为抖动<br>    主要是因为分配给进程的物理块不够</p>
<p>工作集: 指在某段时间间隔里,进程实际访问页面的集合</p>
<p>工作集大小可能小于窗口尺寸<br>驻留集大小不能小于工作集大小,否则进程运行过程中将频繁缺页</p>

                
            </div>
            <hr/>

            

    <div class="reprint" id="reprint-statement">
        
            <div class="reprint__author">
                <span class="reprint-meta" style="font-weight: bold;">
                    <i class="fas fa-user">
                        文章作者:
                    </i>
                </span>
                <span class="reprint-info">
                    <a href="/shiqing/about" rel="external nofollow noreferrer">世庆</a>
                </span>
            </div>
            <div class="reprint__type">
                <span class="reprint-meta" style="font-weight: bold;">
                    <i class="fas fa-link">
                        文章链接:
                    </i>
                </span>
                <span class="reprint-info">
                    <a href="https://shiqing.gitee.io/shiqing/2021/05/24/cao-zuo-xi-tong/cao-zuo-xi-tong-di-san-zhang/">https://shiqing.gitee.io/shiqing/2021/05/24/cao-zuo-xi-tong/cao-zuo-xi-tong-di-san-zhang/</a>
                </span>
            </div>
            <div class="reprint__notice">
                <span class="reprint-meta" style="font-weight: bold;">
                    <i class="fas fa-copyright">
                        版权声明:
                    </i>
                </span>
                <span class="reprint-info">
                    本博客所有文章除特別声明外，均采用
                    <a href="https://creativecommons.org/licenses/by/4.0/deed.zh" rel="external nofollow noreferrer" target="_blank">CC BY 4.0</a>
                    许可协议。转载请注明来源
                    <a href="/shiqing/about" target="_blank">世庆</a>
                    !
                </span>
            </div>
        
    </div>

    <script async defer>
      document.addEventListener("copy", function (e) {
        let toastHTML = '<span>复制成功，请遵循本文的转载规则</span><button class="btn-flat toast-action" onclick="navToReprintStatement()" style="font-size: smaller">查看</a>';
        M.toast({html: toastHTML})
      });

      function navToReprintStatement() {
        $("html, body").animate({scrollTop: $("#reprint-statement").offset().top - 80}, 800);
      }
    </script>



            <div class="tag_share" style="display: block;">
                <div class="post-meta__tag-list" style="display: inline-block;">
                    
                        <div class="article-tag">
                            
                                <a href="/shiqing/tags/%E5%86%85%E5%AD%98/">
                                    <span class="chip bg-color">内存</span>
                                </a>
                            
                        </div>
                    
                </div>
                <div class="post_share" style="zoom: 80%; width: fit-content; display: inline-block; float: right; margin: -0.15rem 0;">
                    <link rel="stylesheet" type="text/css" href="/shiqing/libs/share/css/share.min.css">
<div id="article-share">

    
    <div class="social-share" data-sites="twitter,facebook,google,qq,qzone,wechat,weibo,douban,linkedin" data-wechat-qrcode-helper="<p>微信扫一扫即可分享！</p>"></div>
    <script src="/shiqing/libs/share/js/social-share.min.js"></script>
    

    

</div>

                </div>
            </div>
            
                <style>
    #reward {
        margin: 40px 0;
        text-align: center;
    }

    #reward .reward-link {
        font-size: 1.4rem;
        line-height: 38px;
    }

    #reward .btn-floating:hover {
        box-shadow: 0 6px 12px rgba(0, 0, 0, 0.2), 0 5px 15px rgba(0, 0, 0, 0.2);
    }

    #rewardModal {
        width: 320px;
        height: 350px;
    }

    #rewardModal .reward-title {
        margin: 15px auto;
        padding-bottom: 5px;
    }

    #rewardModal .modal-content {
        padding: 10px;
    }

    #rewardModal .close {
        position: absolute;
        right: 15px;
        top: 15px;
        color: rgba(0, 0, 0, 0.5);
        font-size: 1.3rem;
        line-height: 20px;
        cursor: pointer;
    }

    #rewardModal .close:hover {
        color: #ef5350;
        transform: scale(1.3);
        -moz-transform:scale(1.3);
        -webkit-transform:scale(1.3);
        -o-transform:scale(1.3);
    }

    #rewardModal .reward-tabs {
        margin: 0 auto;
        width: 210px;
    }

    .reward-tabs .tabs {
        height: 38px;
        margin: 10px auto;
        padding-left: 0;
    }

    .reward-content ul {
        padding-left: 0 !important;
    }

    .reward-tabs .tabs .tab {
        height: 38px;
        line-height: 38px;
    }

    .reward-tabs .tab a {
        color: #fff;
        background-color: #ccc;
    }

    .reward-tabs .tab a:hover {
        background-color: #ccc;
        color: #fff;
    }

    .reward-tabs .wechat-tab .active {
        color: #fff !important;
        background-color: #22AB38 !important;
    }

    .reward-tabs .alipay-tab .active {
        color: #fff !important;
        background-color: #019FE8 !important;
    }

    .reward-tabs .reward-img {
        width: 210px;
        height: 210px;
    }
</style>

<div id="reward">
    <a href="#rewardModal" class="reward-link modal-trigger btn-floating btn-medium waves-effect waves-light red">赏</a>

    <!-- Modal Structure -->
    <div id="rewardModal" class="modal">
        <div class="modal-content">
            <a class="close modal-close"><i class="fas fa-times"></i></a>
            <h4 class="reward-title">你的赏识是我前进的动力</h4>
            <div class="reward-content">
                <div class="reward-tabs">
                    <ul class="tabs row">
                        <li class="tab col s6 alipay-tab waves-effect waves-light"><a href="#alipay">支付宝</a></li>
                        <li class="tab col s6 wechat-tab waves-effect waves-light"><a href="#wechat">微 信</a></li>
                    </ul>
                    <div id="alipay">
                        <img src="/shiqing/medias/reward/alipay.jpg" class="reward-img" alt="支付宝打赏二维码">
                    </div>
                    <div id="wechat">
                        <img src="/shiqing/medias/reward/wechat.png" class="reward-img" alt="微信打赏二维码">
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<script>
    $(function () {
        $('.tabs').tabs();
    });
</script>

            
        </div>
    </div>

    

    

    

    

    

    

    

    

<article id="prenext-posts" class="prev-next articles">
    <div class="row article-row">
        
        <div class="article col s12 m6" data-aos="fade-up">
            <div class="article-badge left-badge text-color">
                <i class="fas fa-chevron-left"></i>&nbsp;上一篇</div>
            <div class="card">
                <a href="/shiqing/2021/05/25/cao-zuo-xi-tong/cao-zuo-xi-tong-di-si-zhang/">
                    <div class="card-image">
                        
                        
                        <img src="/shiqing/medias/featureimages/10.jpg" class="responsive-img" alt="操作系统第四章">
                        
                        <span class="card-title">操作系统第四章</span>
                    </div>
                </a>
                <div class="card-content article-content">
                    <div class="summary block-with-text">
                        
                            
                        
                    </div>
                    <div class="publish-info">
                        <span class="publish-date">
                            <i class="far fa-clock fa-fw icon-date"></i>2021-05-25
                        </span>
                        <span class="publish-author">
                            
                            <i class="fas fa-bookmark fa-fw icon-category"></i>
                            
                            <a href="/shiqing/categories/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/" class="post-category">
                                    操作系统
                                </a>
                            
                            
                        </span>
                    </div>
                </div>
                
                <div class="card-action article-tags">
                    
                    <a href="/shiqing/tags/%E6%96%87%E4%BB%B6/">
                        <span class="chip bg-color">文件</span>
                    </a>
                    
                </div>
                
            </div>
        </div>
        
        
        <div class="article col s12 m6" data-aos="fade-up">
            <div class="article-badge right-badge text-color">
                下一篇&nbsp;<i class="fas fa-chevron-right"></i>
            </div>
            <div class="card">
                <a href="/shiqing/2021/05/10/cao-zuo-xi-tong/cao-zuo-xi-tong-di-er-zhang/">
                    <div class="card-image">
                        
                        
                        <img src="/shiqing/medias/featureimages/19.jpg" class="responsive-img" alt="操作系统第二章">
                        
                        <span class="card-title">操作系统第二章</span>
                    </div>
                </a>
                <div class="card-content article-content">
                    <div class="summary block-with-text">
                        
                            
                        
                    </div>
                    <div class="publish-info">
                            <span class="publish-date">
                                <i class="far fa-clock fa-fw icon-date"></i>2021-05-10
                            </span>
                        <span class="publish-author">
                            
                            <i class="fas fa-bookmark fa-fw icon-category"></i>
                            
                            <a href="/shiqing/categories/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/" class="post-category">
                                    操作系统
                                </a>
                            
                            
                        </span>
                    </div>
                </div>
                
                <div class="card-action article-tags">
                    
                    <a href="/shiqing/tags/%E8%BF%9B%E7%A8%8B/">
                        <span class="chip bg-color">进程</span>
                    </a>
                    
                </div>
                
            </div>
        </div>
        
    </div>
</article>

</div>



<!-- 代码块功能依赖 -->
<script type="text/javascript" src="/shiqing/libs/codeBlock/codeBlockFuction.js"></script>

<!-- 代码语言 -->

<script type="text/javascript" src="/shiqing/libs/codeBlock/codeLang.js"></script>


<!-- 代码块复制 -->

<script type="text/javascript" src="/shiqing/libs/codeBlock/codeCopy.js"></script>


<!-- 代码块收缩 -->

<script type="text/javascript" src="/shiqing/libs/codeBlock/codeShrink.js"></script>


    </div>
    <div id="toc-aside" class="expanded col l3 hide-on-med-and-down">
        <div class="toc-widget card" style="background-color: white;">
            <div class="toc-title"><i class="far fa-list-alt"></i>&nbsp;&nbsp;目录</div>
            <div id="toc-content"></div>
        </div>
    </div>
</div>

<!-- TOC 悬浮按钮. -->

<div id="floating-toc-btn" class="hide-on-med-and-down">
    <a class="btn-floating btn-large bg-color">
        <i class="fas fa-list-ul"></i>
    </a>
</div>


<script src="/shiqing/libs/tocbot/tocbot.min.js"></script>
<script>
    $(function () {
        tocbot.init({
            tocSelector: '#toc-content',
            contentSelector: '#articleContent',
            headingsOffset: -($(window).height() * 0.4 - 45),
            collapseDepth: Number('0'),
            headingSelector: 'h2, h3, h4'
        });

        // modify the toc link href to support Chinese.
        let i = 0;
        let tocHeading = 'toc-heading-';
        $('#toc-content a').each(function () {
            $(this).attr('href', '#' + tocHeading + (++i));
        });

        // modify the heading title id to support Chinese.
        i = 0;
        $('#articleContent').children('h2, h3, h4').each(function () {
            $(this).attr('id', tocHeading + (++i));
        });

        // Set scroll toc fixed.
        let tocHeight = parseInt($(window).height() * 0.4 - 64);
        let $tocWidget = $('.toc-widget');
        $(window).scroll(function () {
            let scroll = $(window).scrollTop();
            /* add post toc fixed. */
            if (scroll > tocHeight) {
                $tocWidget.addClass('toc-fixed');
            } else {
                $tocWidget.removeClass('toc-fixed');
            }
        });

        
        /* 修复文章卡片 div 的宽度. */
        let fixPostCardWidth = function (srcId, targetId) {
            let srcDiv = $('#' + srcId);
            if (srcDiv.length === 0) {
                return;
            }

            let w = srcDiv.width();
            if (w >= 450) {
                w = w + 21;
            } else if (w >= 350 && w < 450) {
                w = w + 18;
            } else if (w >= 300 && w < 350) {
                w = w + 16;
            } else {
                w = w + 14;
            }
            $('#' + targetId).width(w);
        };

        // 切换TOC目录展开收缩的相关操作.
        const expandedClass = 'expanded';
        let $tocAside = $('#toc-aside');
        let $mainContent = $('#main-content');
        $('#floating-toc-btn .btn-floating').click(function () {
            if ($tocAside.hasClass(expandedClass)) {
                $tocAside.removeClass(expandedClass).hide();
                $mainContent.removeClass('l9');
            } else {
                $tocAside.addClass(expandedClass).show();
                $mainContent.addClass('l9');
            }
            fixPostCardWidth('artDetail', 'prenext-posts');
        });
        
    });
</script>

    

</main>




        <footer class="page-footer bg-color">
    
    <div class="container row center-align" style="margin-bottom: 0px !important;">
        <div class="col s12 m8 l8 copy-right">
            Copyright&nbsp;&copy;
            
                <span id="year">2019-2024</span>
            
            <span id="year">2019</span>
            <a href="/shiqing/about" target="_blank">ShiQing</a>
            |&nbsp;Powered by&nbsp;<a href="https://hexo.io/" target="_blank">Hexo</a>
            |&nbsp;Theme&nbsp;<a href="https://github.com/blinkfox/hexo-theme-matery" target="_blank">Matery</a>
            <br>
            
            
            
            
            
            
            <span id="busuanzi_container_site_pv">
                |&nbsp;<i class="far fa-eye"></i>&nbsp;总访问量:&nbsp;<span id="busuanzi_value_site_pv"
                    class="white-color"></span>&nbsp;次
            </span>
            
            
            <span id="busuanzi_container_site_uv">
                |&nbsp;<i class="fas fa-users"></i>&nbsp;总访问人数:&nbsp;<span id="busuanzi_value_site_uv"
                    class="white-color"></span>&nbsp;人
            </span>
            
            <br>
            
            <br>
            
        </div>
        <div class="col s12 m4 l4 social-link social-statis">
    <a href="https://github.com/blinkfox" class="tooltipped" target="_blank" data-tooltip="访问我的GitHub" data-position="top" data-delay="50">
        <i class="fab fa-github"></i>
    </a>



    <a href="mailto:2528393970@qq.com" class="tooltipped" target="_blank" data-tooltip="邮件联系我" data-position="top" data-delay="50">
        <i class="fas fa-envelope-open"></i>
    </a>



    <a href="tencent://AddContact/?fromId=50&fromSubId=1&subcmd=all&uin=2528393970" class="tooltipped" target="_blank" data-tooltip="QQ联系我: 2528393970" data-position="top" data-delay="50">
        <i class="fab fa-qq"></i>
    </a>







    <a href="/shiqing/atom.xml" class="tooltipped" target="_blank" data-tooltip="RSS 订阅" data-position="top" data-delay="50">
        <i class="fas fa-rss"></i>
    </a>

</div>
    </div>
</footer>

<div class="progress-bar"></div>


        <!-- 搜索遮罩框 -->
<div id="searchModal" class="modal">
    <div class="modal-content">
        <div class="search-header">
            <span class="title"><i class="fas fa-search"></i>&nbsp;&nbsp;搜索</span>
            <input type="search" id="searchInput" name="s" placeholder="请输入搜索的关键字"
                   class="search-input">
        </div>
        <div id="searchResult"></div>
    </div>
</div>

<script type="text/javascript">
$(function () {
    var searchFunc = function (path, search_id, content_id) {
        'use strict';
        $.ajax({
            url: path,
            dataType: "xml",
            success: function (xmlResponse) {
                // get the contents from search data
                var datas = $("entry", xmlResponse).map(function () {
                    return {
                        title: $("title", this).text(),
                        content: $("content", this).text(),
                        url: $("url", this).text()
                    };
                }).get();
                var $input = document.getElementById(search_id);
                var $resultContent = document.getElementById(content_id);
                $input.addEventListener('input', function () {
                    var str = '<ul class=\"search-result-list\">';
                    var keywords = this.value.trim().toLowerCase().split(/[\s\-]+/);
                    $resultContent.innerHTML = "";
                    if (this.value.trim().length <= 0) {
                        return;
                    }
                    // perform local searching
                    datas.forEach(function (data) {
                        var isMatch = true;
                        var data_title = data.title.trim().toLowerCase();
                        var data_content = data.content.trim().replace(/<[^>]+>/g, "").toLowerCase();
                        var data_url = data.url;
                        data_url = data_url.indexOf('/') === 0 ? data.url : '/' + data_url;
                        var index_title = -1;
                        var index_content = -1;
                        var first_occur = -1;
                        // only match artiles with not empty titles and contents
                        if (data_title !== '' && data_content !== '') {
                            keywords.forEach(function (keyword, i) {
                                index_title = data_title.indexOf(keyword);
                                index_content = data_content.indexOf(keyword);
                                if (index_title < 0 && index_content < 0) {
                                    isMatch = false;
                                } else {
                                    if (index_content < 0) {
                                        index_content = 0;
                                    }
                                    if (i === 0) {
                                        first_occur = index_content;
                                    }
                                }
                            });
                        }
                        // show search results
                        if (isMatch) {
                            str += "<li><a href='" + data_url + "' class='search-result-title'>" + data_title + "</a>";
                            var content = data.content.trim().replace(/<[^>]+>/g, "");
                            if (first_occur >= 0) {
                                // cut out 100 characters
                                var start = first_occur - 20;
                                var end = first_occur + 80;
                                if (start < 0) {
                                    start = 0;
                                }
                                if (start === 0) {
                                    end = 100;
                                }
                                if (end > content.length) {
                                    end = content.length;
                                }
                                var match_content = content.substr(start, end);
                                // highlight all keywords
                                keywords.forEach(function (keyword) {
                                    var regS = new RegExp(keyword, "gi");
                                    match_content = match_content.replace(regS, "<em class=\"search-keyword\">" + keyword + "</em>");
                                });

                                str += "<p class=\"search-result\">" + match_content + "...</p>"
                            }
                            str += "</li>";
                        }
                    });
                    str += "</ul>";
                    $resultContent.innerHTML = str;
                });
            }
        });
    };

    searchFunc('/shiqing/search.xml', 'searchInput', 'searchResult');
});
</script>

        <!-- 回到顶部按钮 -->
<div id="backTop" class="top-scroll">
    <a class="btn-floating btn-large waves-effect waves-light" href="#!">
        <i class="fas fa-arrow-up"></i>
    </a>
</div>


        <script src="/shiqing/libs/materialize/materialize.min.js"></script>
        <script src="/shiqing/libs/masonry/masonry.pkgd.min.js"></script>
        <script src="/shiqing/libs/aos/aos.js"></script>
        <script src="/shiqing/libs/scrollprogress/scrollProgress.min.js"></script>
        <script src="/shiqing/libs/lightGallery/js/lightgallery-all.min.js"></script>
        <script src="/shiqing/js/matery.js"></script>

        <!-- Baidu Analytics -->

        <!-- Baidu Push -->

<script>
    (function () {
        var bp = document.createElement('script');
        var curProtocol = window.location.protocol.split(':')[0];
        if (curProtocol === 'https') {
            bp.src = 'https://zz.bdstatic.com/linksubmit/push.js';
        } else {
            bp.src = 'http://push.zhanzhang.baidu.com/push.js';
        }
        var s = document.getElementsByTagName("script")[0];
        s.parentNode.insertBefore(bp, s);
    })();
</script>

        
        <script src="/shiqing/libs/others/clicklove.js" async="async"></script>
        
        
        <script async src="/shiqing/libs/others/busuanzi.pure.mini.js"></script>
        

        <script type="text/javascript">
            var OriginTitile = document.title,
                st;
            document.addEventListener("visibilitychange", function () {
                document.hidden ? (document.title = "看不见我~看不见我~", clearTimeout(st)) : (document.title =
                    "(๑•̀ㅂ•́) ✧被发现了～", st = setTimeout(function () {
                        document.title = OriginTitile
                    }, 3e3))
            })
        </script>

        <!-- 背景樱花飘落特效 -->
        
            <script type="text/javascript">
                //只在桌面版网页启用特效
                var windowWidth = $(window).width();
                if (windowWidth > 768) {
                    document.write('<script type="text/javascript" src="/js/xuehuapiaoluo.js"><\/script>');
                }
            </script>
        

        

        


        
        

        

        

        
        <script src="/shiqing/libs/instantpage/instantpage.js" type="module"></script>
        

    </body>

</html>
